/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.daten.struktur.container;

import java.lang.reflect.Field;

import de.mnit.basis.daten.struktur.schluessel.S_SchluesselMenge;
import de.mnit.basis.daten.struktur.schluessel.SchluesselMenge;
import de.mnit.basis.daten.typ.Klasse;
import de.mnit.basis.fehler.Fehler;

/**
 * @author Michael Nitsche
 * 09.07.2007	Erstellt
 */
public abstract class A_Kistenstapel {

	private S_SchluesselMenge<String,S_Kiste<?>> inhalt; //Menge
	private String name;


	public String gName() {
		if(name!=null) return name;
		this.name = Klasse.gName(this);
		return name;
	}

	public S_SchluesselMenge<String,S_Kiste<?>> gKisten() {
		if(this.inhalt!=null)
			return this.inhalt;
		this.inhalt=SchluesselMenge.neu();
		Class<?> klasse = this.getClass();
		try {
			Field[] felder = klasse.getFields();
			for(Field feld : felder) {
				Object o=feld.get(this);
				if(o instanceof S_Kiste<?>)
					this.inhalt.plus(feld.getName(),(S_Kiste<?>)o);
			}
		}
		catch(Exception e) {
			Fehler.zeig(e);
		}
//		this.inhalt.schuetzen(); //TODO GGf wieder aktivieren, wenn verfügbar!
		return inhalt;
	}

//	ist ok, siehe B_Teil! Dann ist allerdings ein Generic nötig
//	 implements S_Kopierbar<B_Teil>
//	@SuppressWarnings("unchecked")
//	public B_Teil kopie() {
//		B_Teil kopie=new B_Teil();
//		S_SchluesselMenge<String,S_Kiste> kisten_z=kopie.gKisten();
//		S_SchluesselMenge<String,S_Kiste> kisten_q=this.gKisten();
//		for(Gruppe2<String,S_Kiste> g : kisten_q)
//			kisten_z.gib(g.g1()).s(g.g2().g());
//		return kopie;
//	}

//	public S_Kiste<?> gKiste(String schluessel) {
//		for(Gruppe2<String,S_Kiste> g : this.gKisten())
//			if(g.equals(schluessel))
//				return g.g2();
//		throw Fehler.text.da_Ungueltig(schluessel);
//	}
//
//	public void setze(S_SchluesselListe<String,String> daten) {
//		for(Gruppe2<String,String> g : daten) {
//			String s=g.g1();
//			String w=g.g2();
//
//			S_Kiste kiste=this.gKiste(s);
//			if(kiste==null)
//				Fehler.text.da_Ungueltig(s);
//
//			Class<?> gTyp=kiste.gTyp();
//			if(gTyp.equals(String.class))
//				kiste.s(w);
//			else if(gTyp.equals(S_Zeitpunkt.class))
//				kiste.s(w==null ? null : Zeitpunkt.neu(w));
//			else if(gTyp.equals(Integer.class))
//				kiste.s(w==null ? null : Integer.parseInt(w));
//			else if(gTyp.equals(Boolean.class))
//				kiste.s(w==null ? null : Boolean.parseBoolean(w));
//			else Fehler.sonstige.da_ToDo(gTyp.getName());
//		}
//	}

	public String toString() {
		return gName()+":\n"+gKisten();
	}

	public boolean equals(Object o) {
		if(o==null || !(o instanceof A_Kistenstapel))
			return false;
		return o.toString().equals(this.toString());
	}

}
